﻿-------------------------------------------------------------------------------
--      Вставка шаблона мароса. / Insert macro template. © Shmuel SimSU
-------------------------------------------------------------------------------

---- Настройки
local function Settings()
-- Начало файла Profile\SimSU\Editor_InsertMacro.cfg
return{
  Key="CtrlF11"; --Prior=50; -- Вставка шаблона мароса.

  Template= -- Шаблон макроса.
[[-------------------------------------------------------------------------------
-- %description%
-------------------------------------------------------------------------------

---- Настройки
local function Settings()
-- Начало файла Profile\SimSU\%NAME%.cfg
return{
  Key="%KEY%"; --Prior=50;
}
-- Конец файла Profile\SimSU\%NAME%.cfg
end

---- Локализация
_G.far.lang=far.lang or win.GetEnv("farlang")
-- Встроенные языки / Buildin laguages
local function Messages()
if far.lang=="Russian" then
-- Начало файла Profile\SimSU\%NAME%Russian.lng
return{
  Descr="%description%";
}
-- Конец файла Profile\SimSU\%NAME%Russian.lng
else--if far.lang=="English" then
-- Begin of file Profile\SimSU\%NAME%English.lng
return{
  Descr="%description%";
}
-- End of file Profile\SimSU\%NAME%English.lng
end end

local M=(loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\%NAME%"..far.lang..".lng") or Messages)()
local S=(loadfile(win.GetEnv("FARLOCALPROFILE").."\\SimSU\\%NAME%.cfg") or loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\%NAME%.cfg") or Settings)()

local SimSU=SimSU or {}
SimSU.%NAME%={}
-------------------------------------------------------------------------------
function SimSU.%NAME%.%NAME%()

end
-------------------------------------------------------------------------------
if not Macro then return {%NAME%=SimSU.%NAME%} end

local ok, mod = pcall(require,"SimSU.%NAME%"); if ok then SimSU=mod else _G.SimSU=SimSU end
-------------------------------------------------------------------------------

Macro {area="%AREA%"; key=S.Key; priority=S.Prior; description=M.Descr; flags="%FLAGS%";
  condition=function() return true end;
  action=SimSU.%NAME%.%NAME%;
}
]];
  DeltaLine=-14; -- На сколько строк сдвинуть курсор.
  DeltaPos=2; -- На сколько символов сдвинуть курсор.
}
-- Конец файла Editor_InsertMacro.cfg
end

---- Локализация
_G.far.lang=far.lang or win.GetEnv("farlang")
-- Встроенные языки / Buildin laguages
local function Messages()
if far.lang=="Russian" then
-- Начало файла Profile\SimSU\Editor_InsertMacroRussian.lng
return{
  Descr="Вставка шаблона мароса. © Shmuel SimSU";
  Title="Настройки макроса";
  description="Описание:";
  Areas="Области:";
  Select=" Выбрать";
  Keys="Клавиши:";
  Add="Добавить";
  DisableOutput="Разрешить во время &выполнения вывод на экран";
  RunAfterFARStart="В&ыполнять после запуска FAR";
  NoSendKeysToPlugins="Не посылать &клавиши в плагины";
  ActivePanel="&Активная панель";
  NoPluginPanels="На панели пла&гина";
  NoFolders="Выполнять для папо&к";
  NoSelection="&Отмечены файлы";
  PassivePanel="&Пассивная панель";
  NotEmptyCommandLine="Пустая командная &строка";
  EVSelection="Отмечен б&лок";
  Ok="OK";
  Cancel="Отмена";

  MenuBottom="Ins - выбор";
  MenuShell="Файловые панели";
  MenuInfo="Панель информации";
  MenuQView="Панель быстрого просмотра";
  MenuTree="Панель дерева папок";
  MenuFindFolder="Поиск папки";
  MenuSearch="Быстрый поиск в панелях";
  MenuViewer="Программа просмотра";
  MenuEditor="Редактор";
  MenuDialog="Диалоги";
  MenuMainMenu="Основное меню";
  MenuUserMenu="Меню пользователя";
  MenuDisks="Меню выбора диска";
  MenuMenu="Прочие меню";
  MenuShellAutoCompletion="Список автозавершения в панелях";
  MenuDialogAutoCompletion="Список автозавершения в диалогах";
  MenuHelp="Система помощи";
  MenuOther="Режим копирования текста с экрана";
  MenuCommon="Макросы из этой области работают везде";

  RequestKey=" Нажмите клавишу... ";
}
-- Конец файла Editor_InsertMacroRussian.lng
else--if far.lang=="English" then
-- Begin of file Profile\SimSU\Editor_InsertMacroEnglish.lng
return{
  Descr="Insert macro template. © Shmuel SimSU";
  Title="Macro settings";
  description="description:";
  Areas="Areas:";
  Select=" Select ";
  Keys="Keys:";
  Add="  Add   ";
  DisableOutput="Allo&w screen output while Common_Executing macro";
  RunAfterFARStart="Common_Execute after FAR &start";
  NoSendKeysToPlugins="Do not send &keys to plugins";
  ActivePanel="&ActivePanel";
  NoPluginPanels="P&lugin panel";
  NoFolders="Common_Execute for &folders";
  NoSelection="Se&lection present";
  PassivePanel="&Passive panel";
  NotEmptyCommandLine="Empty &command line";
  EVSelection="Selection &block present";
  Ok="OK";
  Cancel="Cancel";

  MenuBottom="Ins - select";
  MenuShell="File panels";
  MenuInfo="Info panel";
  MenuQView="Quick view panel";
  MenuTree="Tree panel";
  MenuFindFolder="Find folder";
  MenuSearch="Fast find in panels";
  MenuViewer="Viewer";
  MenuEditor="Editor";
  MenuDialog="Dialog";
  MenuMainMenu="Main menu";
  MenuUserMenu="User menu";
  MenuDisks="Change drive menu";
  MenuMenu="Other menu";
  MenuShellAutoCompletion="Auto complete in panels";
  MenuDialogAutoCompletion="Auto complete in dialogs";
  MenuHelp="Help";
  MenuOther="Mode of copying of the text from the screen";
  MenuCommon="Macroes from this area work everywhere";

  RequestKey=" Press key... ";
}
-- End of file Editor_InsertMacroEnglish.lng
end end

-------------------------------------------------------------------------------
local M=(loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_InsertMacro"..far.lang..".lng") or Messages)()
local S=(loadfile(win.GetEnv("FARLOCALPROFILE").."\\SimSU\\Editor_InsertMacro.cfg") or loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_InsertMacro.cfg") or Settings)()

local SimSU=SimSU or {}
-------------------------------------------------------------------------------
local Template=S.Template or "name=%%NAME%% description=%%description%% area=%%AREA%% key=%%KEY%% flags=%%FLAGS%%"

function SimSU.Editor_InsertMacro()
  local F=far.Flags

  local Items =
  {
  --[[01]]  {F.DI_DOUBLEBOX,3, 1,69,22,0,0,0,0,M.Title},
  --[[02]]  {F.DI_TEXT,     5, 2, 0, 2,0,0,0,0,M.description},
  --[[03]]  {F.DI_EDIT,     5, 3,67, 3,0,"Macrodescription",0,F.DIF_HISTORY,""},
  --[[04]]  {F.DI_TEXT,     5, 4, 0, 4,0,0,0,0,M.Areas},
  --[[05]]  {F.DI_EDIT,     5, 5,55, 5,0,"",0,0,""},
  --[[06]]  {F.DI_BUTTON,  57, 5, 0, 5,0,0,0,F.DIF_BTNNOCLOSE,M.Select},
  --[[07]]  {F.DI_TEXT,     5, 6, 0, 6,0,0,0,0,M.Keys},
  --[[08]]  {F.DI_EDIT,     5, 7,55, 7,0,"",0,0,""},
  --[[09]]  {F.DI_BUTTON,  57, 7, 0, 7,0,0,0,F.DIF_BTNNOCLOSE,M.Add},
  --[[10]]  {F.DI_TEXT,    -1, 8, 0, 8,0,0,0,F.DIF_SEPARATOR,""},
  --[[11]]  {F.DI_CHECKBOX, 5, 9, 0, 9,0,0,0,0,M.DisableOutput},
  --[[12]]  {F.DI_CHECKBOX, 5,10, 0,10,0,0,0,0,M.RunAfterFARStart},
  --[[13]]  {F.DI_CHECKBOX, 5,11, 0,11,0,0,0,0,M.NoSendKeysToPlugins},
  --[[14]]  {F.DI_TEXT,    -1,12, 0,12,0,0,0,F.DIF_SEPARATOR,""},
  --[[15]]  {F.DI_CHECKBOX ,5,13, 0,13,0,0,0,0,M.ActivePanel},
  --[[16]]  {F.DI_CHECKBOX, 7,14, 0,14,2,0,0,{DIF_3STATE=1,DIF_DISABLE=1},M.NoPluginPanels},
  --[[17]]  {F.DI_CHECKBOX, 7,15, 0,15,2,0,0,{DIF_3STATE=1,DIF_DISABLE=1},M.NoFolders},
  --[[18]]  {F.DI_CHECKBOX, 7,16, 0,16,2,0,0,{DIF_3STATE=1,DIF_DISABLE=1},M.NoSelection},
  --[[19]]  {F.DI_CHECKBOX,37,13, 0,13,0,0,0,0,M.PassivePanel},
  --[[20]]  {F.DI_CHECKBOX,39,14, 0,14,2,0,0,{DIF_3STATE=1,DIF_DISABLE=1},M.NoPluginPanels},
  --[[21]]  {F.DI_CHECKBOX,39,15, 0,15,2,0,0,{DIF_3STATE=1,DIF_DISABLE=1},M.NoFolders},
  --[[22]]  {F.DI_CHECKBOX,39,16, 0,16,2,0,0,{DIF_3STATE=1,DIF_DISABLE=1},M.NoSelection},
  --[[23]]  {F.DI_TEXT,    -1,17, 0,17,0,0,0,F.DIF_SEPARATOR,""},
  --[[24]]  {F.DI_CHECKBOX, 5,18, 0,18,2,0,0,F.DIF_3STATE,M.NotEmptyCommandLine},
  --[[25]]  {F.DI_CHECKBOX, 5,19, 0,19,2,0,0,F.DIF_3STATE,M.EVSelection},
  --[[26]]  {F.DI_TEXT,    -1,20, 0,20,0,0,0,F.DIF_SEPARATOR,""},
  --[[27]]  {F.DI_BUTTON,   0,21, 0,21,0,0,0,{DIF_DEFAULTBUTTON=1,DIF_CENTERGROUP=1},M.Ok},
  --[[28]]  {F.DI_BUTTON,   0,21, 0,21,0,0,0,F.DIF_CENTERGROUP,M.Cancel},
  }

  local function MenuAreas(areas)
    local prop ={Bottom=M.MenuBottom; Title="";}
    local items = {
      {text=("Shell                │ %q"):format(M.MenuShell)};
      {text=("Info                 │ %q"):format(M.MenuInfo)};
      {text=("QView                │ %q"):format(M.MenuQView)};
      {text=("Tree                 │ %q"):format(M.MenuTree)};
      {text=("FindFolder           │ %q"):format(M.MenuFindFolder)};
      {text=("Search               │ %q"):format(M.MenuSearch)};
      {text=("Viewer               │ %q"):format(M.MenuViewer)};
      {text=("Editor               │ %q"):format(M.MenuEditor)};
      {text=("Dialog               │ %q"):format(M.MenuDialog)};
      {text=("MainMenu             │ %q"):format(M.MenuMainMenu)};
      {text=("UserMenu             │ %q"):format(M.MenuUserMenu)};
      {text=("Disks                │ %q"):format(M.MenuDisks)};
      {text=("Menu                 │ %q"):format(M.MenuMenu)};
      {text=("ShellAutoCompletion  │ %q"):format(M.MenuShellAutoCompletion)};
      {text=("DialogAutoCompletion │ %q"):format(M.MenuDialogAutoCompletion)};
      {text=("Help                 │ %q"):format(M.MenuHelp)};
      {text=("Other                │ %q"):format(M.MenuOther)};
      {text=("Common               │ %q"):format(M.MenuCommon)};
    }
    for s in areas:gmatch("[%w%.]+") do
      s=s.." "
      local pos=nil
      for i=1,#items do
        pos= items[i].text:find(s,1,true)==1 and i or pos
      end
      if pos then items[pos].checked=true end
    end
    local bkeys = {{BreakKey="INSERT"}}
    while true do
      local item, pos = far.Menu (prop, items, bkeys)
      if not item then break end
      prop.SelectIndex=pos
      if item.BreakKey then
        items[pos].checked= not items[pos].checked
      else
        areas={}
        for i=1,#items do
          if items[i].checked then
            areas[#areas+1]=items[i].text:match("[%w%.]+")
          end
        end
        if #areas==0 then
          areas=items[pos].text:match("[%w%.]+")
        else
          areas=table.concat(areas," ")
        end
        return areas
      end
    end
  end

  local function MacroKey(hDlg)
    far.Message(M.RequestKey,"","")
    local VK=mf.waitkey()
    far.SendDlgMessage(hDlg,"DM_REDRAW")
    return VK
  end

  local function DlgProc(hDlg,Msg,Param1,Param2)
    if Msg == F.DN_BTNCLICK then
      if Param1==15 or Param1==19 then
        local enable = far.SendDlgMessage(hDlg,"DM_GETCHECK",Param1)
        far.SendDlgMessage(hDlg,"DM_ENABLE",Param1+1,enable)
        far.SendDlgMessage(hDlg,"DM_ENABLE",Param1+2,enable)
        far.SendDlgMessage(hDlg,"DM_ENABLE",Param1+3,enable)
      elseif Param1==6 then
        local areas=MenuAreas(far.SendDlgMessage(hDlg,"DM_GETTEXT",5,areas))
        if areas then far.SendDlgMessage(hDlg,"DM_SETTEXT",5,areas) end
      elseif Param1==9 then
        local key=MacroKey(hDlg)
        local keys=far.SendDlgMessage(hDlg,"DM_GETTEXT",8,areas)
        keys = keys=="" and key or keys.." "..key
        far.SendDlgMessage(hDlg,"DM_SETTEXT",8,keys)
      end
    end
  end

  local guid = win.Uuid("7feed31e-ce59-4f94-9dd9-7da619b4ef00")
  if far.Dialog (guid,-1,-1,73,24,nil,Items,nil,DlgProc) ~= 27 then return end

  local tFlags = {}
  if Items[11][6]==1 then tFlags[#tFlags+1]="EnableOutput" end
  if Items[12][6]==1 then tFlags[#tFlags+1]="RunAfterFARStart" end
  if Items[13][6]==1 then tFlags[#tFlags+1]="NoSendKeysToPlugins" end

  if Items[15][6]==1 then
    if     Items[16][6]==0 then tFlags[#tFlags+1]="NoPluginPanels"
    elseif Items[16][6]==1 then tFlags[#tFlags+1]="NoFilePanels"
    end
    if     Items[17][6]==0 then tFlags[#tFlags+1]="NoFolders"
    elseif Items[17][6]==1 then tFlags[#tFlags+1]="NoFiles"
    end
    if     Items[18][6]==0 then tFlags[#tFlags+1]="NoSelection"
    elseif Items[18][6]==1 then tFlags[#tFlags+1]="Selection"
    end
  end

  if Items[19][6]==1 then
    if     Items[20][6]==0 then tFlags[#tFlags+1]="NoPluginPPanels"
    elseif Items[20][6]==1 then tFlags[#tFlags+1]="NoFilePPanels"
    end
    if     Items[21][6]==0 then tFlags[#tFlags+1]="NoPFolders"
    elseif Items[21][6]==1 then tFlags[#tFlags+1]="NoPFiles"
    end
    if     Items[22][6]==0 then tFlags[#tFlags+1]="NoPSelection"
    elseif Items[22][6]==1 then tFlags[#tFlags+1]="PSelection"
    end
  end

  if     Items[24][6]==0 then tFlags[#tFlags+1]="NotEmptyCommandLine"
  elseif Items[24][6]==1 then tFlags[#tFlags+1]="EmptyCommandLine"
  end

  if     Items[25][6]==0 then tFlags[#tFlags+1]="NoEVSelection"
  elseif Items[25][6]==1 then tFlags[#tFlags+1]="EVSelection"
  end

  local Template=Template:gsub("%%NAME%%",mf.fsplit(editor.GetFileName(),0x00000004))
  Template=Template:gsub("%%description%%",Items[3][10])
  Template=Template:gsub("%%AREA%%",Items[5][10])
  Template=Template:gsub("%%KEY%%",Items[8][10])
  Template=Template:gsub("%%FLAGS%%",table.concat(tFlags,' '))
  print(Template)

  local Inf=editor.GetInfo()
  editor.SetPosition(nil,Inf.CurLine+S.DeltaLine,Inf.CurPos+S.DeltaPos,-1,-1,-1,-1)

end
-------------------------------------------------------------------------------
if not Macro then return {Editor_InsertMacro=SimSU.Editor_InsertMacro} end

local ok, mod = pcall(require,"SimSU.Editor_InsertMacro"); if ok then SimSU=mod else _G.SimSU=SimSU end
-------------------------------------------------------------------------------

Macro {area="Editor"; key=S.Key; description=M.Descr; priority=S.Prior; filemask="*.lua";
  action=SimSU.Editor_InsertMacro;
}
